package com.lqk.singleton.staticinnerclass;

/**
 * @author lqk
 * @date 2021/11/30 15:26
 */
public class StaticInnerClass {
    public static void main(String[] args) {

    }
}

/**
 * 静态内部类
 *  1) 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
 *  2) 静态内部类方式在Singleton类被装载时并不会立即实例化，而是在需要实例化
 *  时，调用getInstance方法，才会装载SingletonInstance类，从而完成Singleton的
 *  实例化。
 *  3) 类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM帮助我们
 *  保证了线程的安全性，在类进行初始化时，别的线程是无法进入的。
 *  4) 优点：避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 *  5) 结论：推荐使用.
 */
class Singleton{
    private static volatile Singleton instance;

    private Singleton(){

    }
    // 写一个静态内部类，该类中有一个静态属性 Singleton
    /**
     * 在加载类 Singleton 的时候并不会加载类 SingletonInstance，
     * 只有调用类 SingletonInstance 的时候才会被加载，所以可以实现懒加载
     * 而 JVM 在装载类 SingletonInstance 的时候是线程安全的，解决了初始化 Singleton 类
     * 的时候的线程安全问题
     */
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }

    // 提供一个静态的公有方法，直接返回 SingletonInstance.INSTANCE
    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}
